package com.qing.operator;

/**
 * 操作运算符
 * 1：算数运算（一元运算、二元运算）
 * 2：赋值运算
 * 3：关系运算
 * 4：幂运算
 * 5：逻辑运算
 * 6：短路运算
 * 7：扩展赋值运算
 * 8：三目运算（条件运算&三元运算）
 */
public class Operator {

    int a = 10;
    int b = 20;


    public static void main(String[] args) {

        Operator operator = new Operator();
        int a = operator.a;
        int b = operator.b;

        //算数运算
        //一元运算符（单个单元操作，本身）++ -- 自增 自减
        // a++ (a = a + 1); b-- (b = b - 1);
        //a++,下面输出10，这行代码走完后，a才会+1
        System.out.println(a++);
        //此时输出变成11
        System.out.println(a);
        //--b,输出的时候已经变成20-1 = 19了；
        System.out.println(--b);
        //先给c赋值，然后自己自增，此时a为11，c也是输出11
        int c = a++;
        System.out.println(c);//11
        //先自减，再赋值，19-1 = 18，d = 18
        int d = --b;
        System.out.println(d);

        //二元运算符 （两个单元操作）
        System.out.println(a + b);
        System.out.println(a - b);
        System.out.println(a * b);
        //两个int类型会输出0
        System.out.println(a / b);
        //强转为double 输出正常0.5
        System.out.println(a / (double) b);
        //b余a 10%20 = 0，取余，也叫   模运算
        System.out.println(b % a);
        //16%5 = 3 余 1，输出1
        System.out.println(16 % 5);


        //赋值运算
        int num = 10;


        //关系运算符，返回正确错误
        System.out.println(a > b);
        System.out.println(a < b);
        System.out.println(a >= b);
        System.out.println(a <= b);
        System.out.println(a == b);
        System.out.println(a != b);


        //幂运算，2^3，2的三次方  2³ = 2 * 2 * 2 = 8
        //很多时候，我们会使用工具类来进行数据操作
        System.out.println(Math.pow(2, 3));


        //逻辑运算
        //与(&&)并且、 或(||)或者、 非(!)取反
        boolean flag1 = true;
        boolean flag2 = false;
        /*逻辑与运算
        * && 两个都为真，结果才是真（判断到第一个比较是假，则直接返回假，也就是直接短路）
        * || 两个有一个真，结果就是真（判断到第一个是真，则直接返回真）
        * ！ 如果是真，则为假，如果是假则为真（取反）
        * */
        System.out.println("flag1 && flag2:" + (flag1 && flag2));//false
        System.out.println("flag1 || flag2:" + (flag1 || flag2));//true
        System.out.println("flag2 || flag1:" + (flag2 || flag1));//true
        System.out.println("!(flag1 && flag2):" + !(flag1 && flag2));//true

        //短路运算(测试&&、||遇到第一个真假后是否会直接返回)
        int testNum = 9;

        //当第一个条件不满足时，&&会直接返回false，后面的不做判断
        boolean test1 = (testNum < 4) && (testNum++<10);
        System.out.println(test1);//false
        System.out.println(testNum);//输出9，说明 9 < 4 是假的，直接就返回false，testNumOne++没有执行

        //当第一个条件满足时，后面的判断才会进行，当第一第二条件同时满足时，返回true
        // boolean test2 = (testNum < 11) && (testNum++<10);
        // System.out.println(test2);//true， 9 < 11 true，testNum++运行完才会+1,所以此时还是9，9<10 true,都符合，返回true
        // System.out.println(testNum);//输出9+1 = 10

        //换成++testNum
        boolean test2 = (testNum < 11) && (++testNum<10);
        System.out.println(test2);//false，因为++9=10，10<10是false
        System.out.println(testNum);//输出10


        //扩展赋值运算符
        int a1 = 10;
        int b1 = 20;

        System.out.println(a1+=b1); //a1 = a1 + b1 输出30
        System.out.println(a1-=b1); //a1 = a1 - b1 此时a1 = 30， 30 -20 = 10
        System.out.println(a1*=b1); //a1 = a1 * b1 此时a1 = 10，10 * 20 = 200
        System.out.println(a1/=b1); //a1 = a1 / b1 此时a1 = 200，200 / 20 = 10

        //字符串连接符
        System.out.println(""+a1+b1);//输出1020   String在前面，后面的开始拼接字符
        System.out.println(a1+b1+"");//输出30     String在最后面，前面的开始计算，不拼接
        System.out.println(a1+""+b1);//输出1020     String在中间，也是开视拼接



        //条件运算符（三元运算符）
        // x ? y : z
        //如果x是true的话，结果为y，否则为z
        int salary = 10000;
        String str = salary < 12000 ? "工资不够花" : "工资够花";
        System.out.println(str);//10000<12000,条件满足，则输出工资不够花


    }
}
